//////////////////////////////////////////////////////////////////////////////////
//模拟�?下我设计的naive �? cpu
//////////////////////////////////////////////////////////////////////////////////


module testbench();
wire        cpu_req;
wire[31:0]  data_from_cache;
wire        cache_addr_ok;
wire        cache_data_ok;
reg         clk;
reg         rst;
reg[31:0]   seed;
wire rstn=~rst;
reg[31:0] cur_addr=32'hffffff;
reg[31:0] next_addr=32'hffffff;
initial begin
    clk=0;
    rst=0;
    seed=32'h3;
end
//////////////////////////////////////////////
//时钟信号生成
//////////////////////////////////////////////
always #10 clk = ~clk;
/***********
复位信号生成
*/
initial begin
    #0  rst=1;
    #20 rst=0;
    // #105 rst=1; 
//    #2000000 $stop;
end
/*************
生成读请求与读地�?
*/
assign cpu_req=(cur_addr!=next_addr);
wire[15:0] tag=cur_addr[31:16]+1;
wire[10:0] group=cur_addr[15:5]+1;
wire[4:0] ofs=cur_addr[4:0]+1;

always@(posedge clk)begin
if(cache_data_ok) cur_addr<=next_addr;
else cur_addr<=cur_addr;
end
always @(negedge clk) begin
    next_addr<={tag%16'h4,cur_addr[15:5],ofs%5'h3};
end

cache_top cache_u(
    .clk(clk),
    .resetn(rstn),
    .cpu_req(cpu_req),
    .cache_addr(cur_addr),
    .cache_rdata(data_from_cache),
    .cache_addr_ok(cache_addr_ok),
    .cache_data_ok(cache_data_ok)
);
endmodule
